'use strict';
const crypto = require('crypto'); // 用于签名算法
const url = require('url'); // 用于URL处理
const querystring = require('querystring'); // 用于查询字符串处理

// 替换为你的 APP_ID 和 APP_KEY
const APP_ID = '2025579665'; // 请替换为你的 vivo AI 开放平台 APP_ID
const APP_KEY = 'DWaLmGYeXmNGggPa'; // 请替换为你的 vivo AI 开放平台 APP_KEY

// 生成随机字符串
function genNonce(length = 8) {
  const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}

// 生成规范化查询字符串
function genCanonicalQueryString(params) {
    console.log('Canonicalizing params:', params); // 增加日志
    if (!params) return '';
    const sortedKeys = Object.keys(params).sort();
    const encodedParams = sortedKeys.map(key => {
        const value = params[key];
        // 根据文档，key和value都需要进行URI编码
        // 如果value是null/undefined，URLEncoder.encode会报错或产生不期望的结果，需要转为字符串处理
        const encodedKey = encodeURIComponent(key);
        const encodedValue = encodeURIComponent(String(value)); // 确保将值转为字符串再编码
        return `${encodedKey}=${encodedValue}`;
    });
    const result = encodedParams.join('&');
    console.log('Canonical Query String result:', result); // 增加日志
    return result;
}

// 生成签名 (修正为HMAC-SHA256 Base64编码)
function genSignature(appKey, signingString) {
  const hmac = crypto.createHmac('sha256', appKey);
  hmac.update(signingString, 'utf-8');
  return hmac.digest('base64'); // 使用base64编码
}

// 生成ASR WebSocket连接信息 (包含URL参数和签名)
function genAsrWebSocketInfo(appId, appKey, method, uri, queryParams) {
    const nonce = Math.random().toString(36).substr(2, 8); // 生成8位随机字符串
    const timestamp = Math.floor(Date.now() / 1000).toString(); // 秒级时间戳 (用于X-AI-GATEWAY-TIMESTAMP)

    // ASR接口文档中的URL参数 (包含client_version等必要参数)
    const asrUrlParams = {
        client_version: queryParams.client_version || 'unknown',
        package: queryParams.package || 'unknown',
        sdk_version: queryParams.sdk_version || 'unknown',
        user_id: queryParams.user_id || crypto.randomBytes(16).toString('hex'),
        android_version: queryParams.android_version || 'unknown',
        // ASR文档中的system_time是单位毫秒的string
        system_time: Date.now().toString(), 
        net_type: queryParams.net_type || '1', // 假设默认wifi
        engineid: queryParams.engineid || 'shortasrinput'
    };

    // 鉴权相关的 Header 参数，这些参数也需要参与签名
    const authHeaderParams = {
        'x-ai-gateway-app-id': appId,
        'x-ai-gateway-timestamp': timestamp, // 注意这里使用秒级时间戳
        'x-ai-gateway-nonce': nonce,
        'x-ai-gateway-signed-headers': "x-ai-gateway-app-id;x-ai-gateway-timestamp;x-ai-gateway-nonce",
        // 签名参数最后计算
    };

    // 合并所有将作为URL参数的参数（ASR业务参数 + 鉴权Header参数）
    // 这些参数都将参与 canonical_query_string 的构建
    const allUrlParams = { ...asrUrlParams, ...authHeaderParams };

    // 生成用于签名的规范化query string (包含所有 URL 参数)
    const signingCanonicalQueryString = genCanonicalQueryString(allUrlParams);
    console.log('ASR Canonical Query String (for signing):', signingCanonicalQueryString); // 增加日志

    // 生成 signed_headers_string (用于拼接 signing_string)
    const signed_headers_string_raw = Object.keys(authHeaderParams).sort().map(key => 
        `${key.toLowerCase()}:${authHeaderParams[key]}`
    );
    const signed_headers_string = signed_headers_string_raw.join('\n');
    console.log('ASR Signed Headers Array (for signing):', signed_headers_string_raw); // 增加日志
    console.log('ASR Signed Headers String (for signing):', signed_headers_string); // 增加日志

    // 构建 signing_string (参考通用鉴权文档结构)
    const signing_string = `${method.toUpperCase()}\n` +
                             `${uri}\n` +
                             `${signingCanonicalQueryString}\n` +
                             `${appId}\n` +
                             `${timestamp}\n` +
                             `${signed_headers_string}`;

    console.log('ASR Signing String:', signing_string); // 输出签名串用于调试

    const signature = genSignature(appKey, signing_string);
    console.log('ASR Signature:', signature); // 增加日志

    // 将签名添加到最终将作为URL参数的参数中 (这是为了前端连接的兼容性)
    // 注意：实际鉴权时，vivo可能只读取Header中的Signature
    const finalUrlParams = { ...allUrlParams, 'X-AI-GATEWAY-SIGNATURE': signature };

    // 生成最终的WebSocket URL (包含所有参数作为query string)
    const finalWsUrl = `wss://api-ai.vivo.com.cn${uri}?${genCanonicalQueryString(finalUrlParams)}`;

    // 返回连接信息，包括完整的wsUrl和包含所有鉴权信息的headers对象
    return {
        wsUrl: finalWsUrl,
        // 返回完整的headers对象，供uni.connectSocket使用
        headers: { ...authHeaderParams, 'X-AI-GATEWAY-SIGNATURE': signature }
    };
}

// 云函数主入口
exports.main = async (event, context) => {
	console.log('云函数 yuyin 被调用，事件参数:', event);

    const { action, text, method, uri, query } = event; // 接收前端传递的动作和参数

    if (action === 'getTtsSign') {
        // TTS签名逻辑 (保持不变)
        // ... existing code ...

    } else if (action === 'getAsrSign') {
        // ASR签名逻辑
        if (!method || !uri || !query) {
             console.error('ASR签名缺少必要的请求参数 (method, uri, query)');
            return { code: 400, message: '缺少必要的请求参数 (method, uri, query)' };
        }
        try {
            const asrWebSocketInfo = genAsrWebSocketInfo(APP_ID, APP_KEY, method, uri, query);
            console.log('生成的ASR WebSocket信息:', asrWebSocketInfo);
            return { code: 0, data: asrWebSocketInfo };
        } catch (err) {
            console.error('生成ASR WebSocket信息失败:', err);
            return { code: 500, message: '生成ASR WebSocket信息失败: ' + err.message };
        }
    } else {
         console.warn('未知的云函数动作:', action);
        return { code: 400, message: '未知的动作' };
    }
};

// 注意：请务必在 uniCloud 后台配置 APP_ID 和 APP_KEY
// 或者在这里直接填写你的密钥，但环境变量更安全
